//
// Created by Jisam on 12/10/2024 14:50.
// Solution of  P1541 乌龟棋
// 2024-10-12 15:04:01 AC 100 四维动态规划 + 背包思想
#include <bits/stdc++.h>

#define  int long long
#define  endl "\n"
#define  all(x) (x).begin(),(x).end()
#define  pb push_back
using namespace std;

// 定义最大棋盘大小
const int MAXN = 41;
// 初始化四维动态规划数组f，用于存储每个状态的最大分数
int f[MAXN][MAXN][MAXN][MAXN];

// 主函数
signed main() {
    // 关闭cin与cout的同步，并解除cin的tie
    cin.tie(nullptr)->sync_with_stdio(false);
    // 读取棋盘大小n和步数限制m
    int n, m;
    cin >> n >> m;
    // 初始化两个向量a和b，a存储棋盘上的分数，b存储每种步数出现的次数
    vector<int> a(n + 1, 0), b(5, 0);
    // 读取棋盘上的分数
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    // 初始化动态规划数组f的第一状态为棋盘上的第一个分数
    f[0][0][0][0] = a[1];
    // 读取步数限制，统计每种步数出现的次数
    int x;
    for (int i = 1; i <= m; i++) {
        cin >> x;
        b[x]++;
    }
    // 进行四维动态规划，计算每个状态的最大分数
    for (int i = 0; i <= b[1]; i++) {
        for (int j = 0; j <= b[2]; j++) {
            for (int k = 0; k <= b[3]; k++) {
                for (int l = 0; l <= b[4]; l++) {
                    // 计算当前状态对应的棋盘位置r
                    int r = 1 + i + j * 2 + k * 3 + l * 4;
                    // 如果当前状态不是初始状态，则更新f[i][j][k][l]为当前状态分数加上前一状态的最大分数
                    if (i != 0) f[i][j][k][l] = max(f[i][j][k][l], f[i - 1][j][k][l] + a[r]);
                    if (j != 0) f[i][j][k][l] = max(f[i][j][k][l], f[i][j - 1][k][l] + a[r]);
                    if (k != 0) f[i][j][k][l] = max(f[i][j][k][l], f[i][j][k - 1][l] + a[r]);
                    if (l != 0) f[i][j][k][l] = max(f[i][j][k][l], f[i][j][k][l - 1] + a[r]);
                }
            }
        }
    }
    // 输出最终的最大分数
    cout << f[b[1]][b[2]][b[3]][b[4]];
    return 0;
}